NexusPi Git Node
lib/microReticulum/src/Cryptography/Token.cpp 20ec0b4ee3f3e7a8b3c8d00dcdcd5afdcf2bc840 (20ec0b4e) Text, 4.17 KB
Tff7b72#Tff7b72include T8b949e"Token.h"
Tff7b72#Tff7b72include T8b949e"HMAC.h"
Tff7b72#Tff7b72include T8b949e"PKCS7.h"
Tff7b72#Tff7b72include T8b949e"AES.h"
Tff7b72#Tff7b72include T8b949e"../Log.h"
Tff7b72#Tff7b72include T8b949e<stdexcept>
Tff7b72#Tff7b72include T8b949e<time.h>
Tff7b72using Tff7b72namespace T7ee787RNSTb4b4b4;
Tff7b72using Tff7b72namespace T7ee787RNSTff7b72:Tff7b72:T7ee787CryptographyTb4b4b4;
Tff7b72using Tff7b72namespace T7ee787RNSTff7b72:Tff7b72:T7ee787TypeTff7b72:Tff7b72:T7ee787CryptographyTff7b72:Tff7b72:T7ee787TokenTb4b4b4;
Te6edf3TokenTff7b72:Tff7b72:Te6edf3TokenTb4b4b4(Tff7b72const Te6edf3BytesTff7b72& Te6edf3keyTb4b4b4, Te6edf3token_mode Te6edf3mode T8b949e/*= AES*/Tb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Tff7b72!Te6edf3keyTb4b4b4) Tb4b4b4{
Tff7b72throw Te6edf3stdTff7b72:Tff7b72:Te6edf3invalid_argumentTb4b4b4(Ta5d6ff"Ta5d6ffToken key cannot be NoneTa5d6ff"Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tff7b72if Tb4b4b4(Te6edf3mode Tff7b72=Tff7b72= Te6edf3MODE_AESTb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3keyTb4b4b4.Te6edf3sizeTb4b4b4(Tb4b4b4) Tff7b72=Tff7b72= T79c0ff32Tb4b4b4) Tb4b4b4{
Te6edf3_mode Tff7b72= Te6edf3MODE_AES_128_CBCTb4b4b4;
Te6edf3_signing_key Tff7b72= Te6edf3keyTb4b4b4.Te6edf3leftTb4b4b4(T79c0ff16Tb4b4b4)Tb4b4b4;
Te6edf3_encryption_key Tff7b72= Te6edf3keyTb4b4b4.Te6edf3midTb4b4b4(T79c0ff16Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tff7b72else Tff7b72if Tb4b4b4(Te6edf3keyTb4b4b4.Te6edf3sizeTb4b4b4(Tb4b4b4) Tff7b72=Tff7b72= T79c0ff64Tb4b4b4) Tb4b4b4{
Te6edf3_mode Tff7b72= Te6edf3MODE_AES_256_CBCTb4b4b4;
Te6edf3_signing_key Tff7b72= Te6edf3keyTb4b4b4.Te6edf3leftTb4b4b4(T79c0ff32Tb4b4b4)Tb4b4b4;
Te6edf3_encryption_key Tff7b72= Te6edf3keyTb4b4b4.Te6edf3midTb4b4b4(T79c0ff32Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tff7b72else Tb4b4b4{
Tff7b72throw Te6edf3stdTff7b72:Tff7b72:Te6edf3invalid_argumentTb4b4b4(Ta5d6ff"Ta5d6ffToken key must be 128 or 256 bits, not Ta5d6ff" Tff7b72+ Te6edf3stdTff7b72:Tff7b72:Te6edf3to_stringTb4b4b4(Te6edf3keyTb4b4b4.Te6edf3sizeTb4b4b4(Tb4b4b4)Tff7b72*T79c0ff8Tb4b4b4)Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tb4b4b4}
Tff7b72else Tb4b4b4{
Tff7b72throw Te6edf3stdTff7b72:Tff7b72:Te6edf3invalid_argumentTb4b4b4(Ta5d6ff"Ta5d6ffInvalid token mode: Ta5d6ff" Tff7b72+ Te6edf3stdTff7b72:Tff7b72:Te6edf3to_stringTb4b4b4(Te6edf3modeTb4b4b4)Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Te6edf3MEMTb4b4b4(Ta5d6ff"Ta5d6ffToken object createdTa5d6ff"Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Te6edf3TokenTff7b72:Tff7b72:Tff7b72~Te6edf3TokenTb4b4b4(Tb4b4b4) Tb4b4b4{
Te6edf3MEMTb4b4b4(Ta5d6ff"Ta5d6ffToken object destroyedTa5d6ff"Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tffa657bool Te6edf3TokenTff7b72:Tff7b72:Te6edf3verify_hmacTb4b4b4(Tff7b72const Te6edf3BytesTff7b72& Te6edf3tokenTb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3tokenTb4b4b4.Te6edf3sizeTb4b4b4(Tb4b4b4) Tff7b72<Tff7b72= T79c0ff32Tb4b4b4) Tb4b4b4{
Tff7b72throw Te6edf3stdTff7b72:Tff7b72:Te6edf3invalid_argumentTb4b4b4(Ta5d6ff"Ta5d6ffCannot verify HMAC on token of only Ta5d6ff" Tff7b72+ Te6edf3stdTff7b72:Tff7b72:Te6edf3to_stringTb4b4b4(Te6edf3tokenTb4b4b4.Te6edf3sizeTb4b4b4(Tb4b4b4)Tb4b4b4) Tff7b72+ Ta5d6ff"Ta5d6ff bytesTa5d6ff"Tb4b4b4)Tb4b4b4;
Tb4b4b4}
T8b949e//received_hmac = token[-32:]
Te6edf3Bytes Te6edf3received_hmac Tff7b72= Te6edf3tokenTb4b4b4.Te6edf3rightTb4b4b4(T79c0ff32Tb4b4b4)Tb4b4b4;
Te6edf3DEBUGTb4b4b4(Ta5d6ff"Ta5d6ffToken::verify_hmac: received_hmac: Ta5d6ff" Tff7b72+ Te6edf3received_hmacTb4b4b4.Te6edf3toHexTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4;
T8b949e//expected_hmac = HMAC.new(self._signing_key, token[:-32]).digest()
Te6edf3Bytes Te6edf3expected_hmac Tff7b72= Te6edf3HMACTff7b72:Tff7b72:Te6edf3generateTb4b4b4(Te6edf3_signing_keyTb4b4b4, Te6edf3tokenTb4b4b4.Te6edf3leftTb4b4b4(Te6edf3tokenTb4b4b4.Te6edf3sizeTb4b4b4(Tb4b4b4)T79c0ff-32Tb4b4b4)Tb4b4b4)Tff7b72-Tff7b72>Te6edf3digestTb4b4b4(Tb4b4b4)Tb4b4b4;
Te6edf3DEBUGTb4b4b4(Ta5d6ff"Ta5d6ffToken::verify_hmac: expected_hmac: Ta5d6ff" Tff7b72+ Te6edf3expected_hmacTb4b4b4.Te6edf3toHexTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4;
Tff7b72return Tb4b4b4(Te6edf3received_hmac Tff7b72=Tff7b72= Te6edf3expected_hmacTb4b4b4)Tb4b4b4;
Tb4b4b4}
Tff7b72const Te6edf3Bytes Te6edf3TokenTff7b72:Tff7b72:Te6edf3encryptTb4b4b4(Tff7b72const Te6edf3BytesTff7b72& Te6edf3dataTb4b4b4) Tb4b4b4{
Te6edf3DEBUGTb4b4b4(Ta5d6ff"Ta5d6ffToken::encrypt: plaintext length: Ta5d6ff" Tff7b72+ Te6edf3stdTff7b72:Tff7b72:Te6edf3to_stringTb4b4b4(Te6edf3dataTb4b4b4.Te6edf3sizeTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4)Tb4b4b4;
Te6edf3Bytes Te6edf3iv Tff7b72= Te6edf3randomTb4b4b4(T79c0ff16Tb4b4b4)Tb4b4b4;
T8b949e//double current_time = OS::time();
Te6edf3TRACETb4b4b4(Ta5d6ff"Ta5d6ffToken::encrypt: iv: Ta5d6ff" Tff7b72+ Te6edf3ivTb4b4b4.Te6edf3toHexTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4;
Te6edf3TRACETb4b4b4(Ta5d6ff"Ta5d6ffToken::encrypt: plaintext: Ta5d6ff" Tff7b72+ Te6edf3dataTb4b4b4.Te6edf3toHexTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4;
Te6edf3Bytes Te6edf3ciphertextTb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3_mode Tff7b72=Tff7b72= Te6edf3MODE_AES_128_CBCTb4b4b4) Tb4b4b4{
Te6edf3ciphertext Tff7b72= Te6edf3AES_128_CBCTff7b72:Tff7b72:Te6edf3encryptTb4b4b4(
Te6edf3PKCS7Tff7b72:Tff7b72:Te6edf3padTb4b4b4(Te6edf3dataTb4b4b4)Tb4b4b4,
Te6edf3_encryption_keyTb4b4b4,
Te6edf3iv
Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tff7b72else Tff7b72if Tb4b4b4(Te6edf3_mode Tff7b72=Tff7b72= Te6edf3MODE_AES_256_CBCTb4b4b4) Tb4b4b4{
Te6edf3ciphertext Tff7b72= Te6edf3AES_256_CBCTff7b72:Tff7b72:Te6edf3encryptTb4b4b4(
Te6edf3PKCS7Tff7b72:Tff7b72:Te6edf3padTb4b4b4(Te6edf3dataTb4b4b4)Tb4b4b4,
Te6edf3_encryption_keyTb4b4b4,
Te6edf3iv
Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tff7b72else Tb4b4b4{
Tff7b72throw Tff7b72new Te6edf3stdTff7b72:Tff7b72:Te6edf3invalid_argumentTb4b4b4(Ta5d6ff"Ta5d6ffInvalid token mode Ta5d6ff"Tff7b72+Te6edf3stdTff7b72:Tff7b72:Te6edf3to_stringTb4b4b4(Te6edf3_modeTb4b4b4)Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Te6edf3DEBUGTb4b4b4(Ta5d6ff"Ta5d6ffToken::encrypt: padded ciphertext length: Ta5d6ff" Tff7b72+ Te6edf3stdTff7b72:Tff7b72:Te6edf3to_stringTb4b4b4(Te6edf3ciphertextTb4b4b4.Te6edf3sizeTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4)Tb4b4b4;
Te6edf3TRACETb4b4b4(Ta5d6ff"Ta5d6ffToken::encrypt: ciphertext: Ta5d6ff" Tff7b72+ Te6edf3ciphertextTb4b4b4.Te6edf3toHexTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4;
Te6edf3Bytes Te6edf3signed_parts Tff7b72= Te6edf3iv Tff7b72+ Te6edf3ciphertextTb4b4b4;
T8b949e//return signed_parts + HMAC::generate(_signing_key, signed_parts)->digest();
Te6edf3Bytes Td2a8ffsigTb4b4b4(Te6edf3HMACTff7b72:Tff7b72:Te6edf3generateTb4b4b4(Te6edf3_signing_keyTb4b4b4, Te6edf3signed_partsTb4b4b4)Tff7b72-Tff7b72>Te6edf3digestTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4;
Te6edf3TRACETb4b4b4(Ta5d6ff"Ta5d6ffToken::encrypt: sig: Ta5d6ff" Tff7b72+ Te6edf3sigTb4b4b4.Te6edf3toHexTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4;
Te6edf3Bytes Td2a8fftokenTb4b4b4(Te6edf3signed_parts Tff7b72+ Te6edf3sigTb4b4b4)Tb4b4b4;
Te6edf3DEBUGTb4b4b4(Ta5d6ff"Ta5d6ffToken::encrypt: token length: Ta5d6ff" Tff7b72+ Te6edf3stdTff7b72:Tff7b72:Te6edf3to_stringTb4b4b4(Te6edf3tokenTb4b4b4.Te6edf3sizeTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4)Tb4b4b4;
Tff7b72return Te6edf3tokenTb4b4b4;
Tb4b4b4}
Tff7b72const Te6edf3Bytes Te6edf3TokenTff7b72:Tff7b72:Te6edf3decryptTb4b4b4(Tff7b72const Te6edf3BytesTff7b72& Te6edf3tokenTb4b4b4) Tb4b4b4{
Te6edf3DEBUGTb4b4b4(Ta5d6ff"Ta5d6ffToken::decrypt: token length: Ta5d6ff" Tff7b72+ Te6edf3stdTff7b72:Tff7b72:Te6edf3to_stringTb4b4b4(Te6edf3tokenTb4b4b4.Te6edf3sizeTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3tokenTb4b4b4.Te6edf3sizeTb4b4b4(Tb4b4b4) Tff7b72< T79c0ff48Tb4b4b4) Tb4b4b4{
Tff7b72throw Te6edf3stdTff7b72:Tff7b72:Te6edf3invalid_argumentTb4b4b4(Ta5d6ff"Ta5d6ffCannot decrypt token of only Ta5d6ff" Tff7b72+ Te6edf3stdTff7b72:Tff7b72:Te6edf3to_stringTb4b4b4(Te6edf3tokenTb4b4b4.Te6edf3sizeTb4b4b4(Tb4b4b4)Tb4b4b4) Tff7b72+ Ta5d6ff"Ta5d6ff bytesTa5d6ff"Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tff7b72if Tb4b4b4(Tff7b72!Te6edf3verify_hmacTb4b4b4(Te6edf3tokenTb4b4b4)Tb4b4b4) Tb4b4b4{
Tff7b72throw Te6edf3stdTff7b72:Tff7b72:Te6edf3invalid_argumentTb4b4b4(Ta5d6ff"Ta5d6ffToken token HMAC was invalidTa5d6ff"Tb4b4b4)Tb4b4b4;
Tb4b4b4}
T8b949e//iv = token[:16]
Te6edf3Bytes Te6edf3iv Tff7b72= Te6edf3tokenTb4b4b4.Te6edf3leftTb4b4b4(T79c0ff16Tb4b4b4)Tb4b4b4;
Te6edf3TRACETb4b4b4(Ta5d6ff"Ta5d6ffToken::decrypt: iv: Ta5d6ff" Tff7b72+ Te6edf3ivTb4b4b4.Te6edf3toHexTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4;
T8b949e//ciphertext = token[16:-32]
Te6edf3Bytes Te6edf3ciphertext Tff7b72= Te6edf3tokenTb4b4b4.Te6edf3midTb4b4b4(T79c0ff16Tb4b4b4, Te6edf3tokenTb4b4b4.Te6edf3sizeTb4b4b4(Tb4b4b4)T79c0ff-48Tb4b4b4)Tb4b4b4;
Te6edf3TRACETb4b4b4(Ta5d6ff"Ta5d6ffToken::decrypt: ciphertext: Ta5d6ff" Tff7b72+ Te6edf3ciphertextTb4b4b4.Te6edf3toHexTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4;
Tff7b72try Tb4b4b4{
Te6edf3Bytes Te6edf3plaintextTb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3_mode Tff7b72=Tff7b72= Te6edf3MODE_AES_128_CBCTb4b4b4) Tb4b4b4{
Te6edf3plaintext Tff7b72= Te6edf3PKCS7Tff7b72:Tff7b72:Te6edf3unpadTb4b4b4(
Te6edf3AES_128_CBCTff7b72:Tff7b72:Te6edf3decryptTb4b4b4(
Te6edf3ciphertextTb4b4b4,
Te6edf3_encryption_keyTb4b4b4,
Te6edf3iv
Tb4b4b4)
Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tff7b72else Tff7b72if Tb4b4b4(Te6edf3_mode Tff7b72=Tff7b72= Te6edf3MODE_AES_256_CBCTb4b4b4) Tb4b4b4{
Te6edf3plaintext Tff7b72= Te6edf3PKCS7Tff7b72:Tff7b72:Te6edf3unpadTb4b4b4(
Te6edf3AES_256_CBCTff7b72:Tff7b72:Te6edf3decryptTb4b4b4(
Te6edf3ciphertextTb4b4b4,
Te6edf3_encryption_keyTb4b4b4,
Te6edf3iv
Tb4b4b4)
Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tff7b72else Tb4b4b4{
Tff7b72throw Tff7b72new Te6edf3stdTff7b72:Tff7b72:Te6edf3invalid_argumentTb4b4b4(Ta5d6ff"Ta5d6ffInvalid token mode Ta5d6ff"Tff7b72+Te6edf3stdTff7b72:Tff7b72:Te6edf3to_stringTb4b4b4(Te6edf3_modeTb4b4b4)Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Te6edf3DEBUGTb4b4b4(Ta5d6ff"Ta5d6ffToken::encrypt: unpadded plaintext length: Ta5d6ff" Tff7b72+ Te6edf3stdTff7b72:Tff7b72:Te6edf3to_stringTb4b4b4(Te6edf3plaintextTb4b4b4.Te6edf3sizeTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4)Tb4b4b4;
Te6edf3TRACETb4b4b4(Ta5d6ff"Ta5d6ffToken::decrypt: plaintext: Ta5d6ff" Tff7b72+ Te6edf3plaintextTb4b4b4.Te6edf3toHexTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4;
Te6edf3DEBUGTb4b4b4(Ta5d6ff"Ta5d6ffToken::decrypt: plaintext length: Ta5d6ff" Tff7b72+ Te6edf3stdTff7b72:Tff7b72:Te6edf3to_stringTb4b4b4(Te6edf3plaintextTb4b4b4.Te6edf3sizeTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4)Tb4b4b4;
Tff7b72return Te6edf3plaintextTb4b4b4;
Tb4b4b4}
Tff7b72catch Tb4b4b4(Te6edf3stdTff7b72:Tff7b72:Te6edf3exceptionTff7b72& Te6edf3eTb4b4b4) Tb4b4b4{
Te6edf3WARNINGTb4b4b4(Ta5d6ff"Ta5d6ffCould not decrypt Token tokenTa5d6ff"Tb4b4b4)Tb4b4b4;
Tff7b72throw Te6edf3stdTff7b72:Tff7b72:Te6edf3runtime_errorTb4b4b4(Ta5d6ff"Ta5d6ffCould not decrypt Token tokenTa5d6ff"Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tb4b4b4}
Served by rngit 1.4.2 - Generated in 0.03s